package com.ww.java8.fp.stream.onjava8.ch14;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author wanggw
 *
 * Stream.generate()的用法，可以把任意Supplier<T>用于生成T类型的流
 */
public class RandomWords implements Supplier<String> {
	
	List<String> words = new ArrayList<>();
	
	Random rand = new Random(47);
	
	RandomWords(String fname) throws IOException {
		List<String> lines = Files.readAllLines(Paths.get(fname));
		for (String line : lines.subList(1, lines.size())) {
			for (String word : line.split("[ .?,]+")) {
				words.add(word.toLowerCase());
			}
		}
	}

	@Override
	public String get() {
		return words.get(rand.nextInt(words.size()));
	}

	@Override
	public String toString() {
		return words.stream()
				// 当你用Collectors.joining()作为collect()参数时，将得到一个String类型的结果，该结果是流中的所有元素被joining()的参数隔开
				.collect(Collectors.joining(" "));
	}
	
	public static void main(String[] args) throws IOException {
		System.out.println(Stream.generate(new RandomWords("D:\\code\\gitee\\java-learn\\src\\main\\java\\com\\ww\\java8\\fp\\stream\\Cheese.dat"))
				.limit(10)
				.collect(Collectors.joining(" ")));
	}
}
